package com.xie.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * 1.整合Mybatis-Plus
 * 1.导入依赖
 * <dependency>
 * <groupId>com.baomidou</groupId>
 * <artifactId>mybatis-plus-boot-starter</artifactId>
 * <version>3.2.0</version>
 * </dependency>
 * 2.配置
 * 配置数据源
 * 导入驱动
 * 在application.yml配置数据源相关信息
 * 配置mybatis-Plus
 * 使用@MapperScan
 * 配置映射文件 sql映射文件位置
 * <p>
 * 2.逻辑删除
 * 配置全聚德逻辑删除规则
 * mybatis-plus
 * logic-delete-value: 1
 * logic-not-delete-value: 0
 * 配置逻辑删除组件 bean
 * 字段加上逻辑删除注解 @TableLogic
 * <p>
 * JSR303校验 参考品牌处理的过程的校验
 * 1.@NotBlank 实体字段天剑校验@
 * 2.在springmvc参数添加校验 @Valid
 * 3.给校验的bean后紧接着添加 BindingResult 就可以获取到校验的结果
 * <p>
 * 4.分组校验 多场景复杂校验
 * 添加分组校验的接口
 *
 * @author xiefeixiang
 * @NotNull(message = "修改必须指定品牌id",groups ={UpdateGroup.class} )
 * controllery添加：
 * @Validated({AddGroup.class}) 默认没有指定分组的校验注解@NotBlank，在分组校验情况下不生效，只在不分组@Validated生效
 * <p>
 * 5.自定义校验 参考状态校验（状态必须是0或者1）
 * 1.编写一个自定义校注解
 * 2.编写一个自定义校验器 实现ConstraintValidator
 * 3.关联自定义的校验器和自定义的校验注解
 * @Documented
 * @Constraint(validatedBy = {ListValueConstraintValidator.class}) 可以指定多个校验器，适配不同类型校验
 * @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 * @Retention(RUNTIME) 统一异常处理
 *
 *
 * 5.模板引擎
 * 1.先引入thymeleaf的starter
 * 2.关闭缓存
 * 3.静态资源放在static目录，可以按照路径访问
 * 4.页面放在template下可以直接访问
 *      springboot会默认找index页面
 * 5.页面修改实时更新 不重启的情况下
 *          <dependency>
 *             <groupId>org.springframework.boot</groupId>
 *             <artifactId>spring-boot-devtools</artifactId>
 *             <optional>true</optional>
 *         </dependency>
 *
 * 6.contrl+shift+f9
 *
 * 7.整合redis
 * 加入依赖
 *    <dependency>
 *        <groupId>org.springframework.boot</groupId>
 *        <artifactId>spring-boot-starter-data-redis</artifactId>
 *    </dependency>
 *
 *
 *    分布式锁：整合redisson
 *    1、添加依赖
 *    <!--        redisson 分布式锁-->
 *         <!-- https://mvnrepository.com/artifact/org.redisson/redisson -->
 *         <dependency>
 *             <groupId>org.redisson</groupId>
 *             <artifactId>redisson</artifactId>
 *             <version>3.12.0</version>
 *         </dependency>
 *    2.配置redisson
 *
 *
 *
 *整合SpringCache简化缓存开发
 * 1.引入依赖
 *      spring-boot-starter-cache、spring-boot-starter-data-redis
 * 2.写配置
 *      1.自动配置了哪些
 *      CacheAutoConfiguration会导入RedisCacheConfiguration
 *      自动配好了缓存管理器RedisCacheManager
 *      2.配置使用redis作为缓存，application.properties
 * 3.测试使用缓存
 *      @Cacheable： 触发将数据保存到缓存的操作
 *      @CacheEvict 触发将数据从缓存删除的操作
 *      @Cacheput: 不影响方法执行更新缓存
 *      @Caching： 组合以上多个操作
 *      @CacheConfig： 在类级别共享缓存的相同配置
 *      1.开启缓存 @EnableCaching
 *      2.@Cacheable
 *      @CacheEvit 缓存失效
 *      @Cacheput 双写模式
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */


@EnableFeignClients(basePackages = "com.xie.gulimall.product.feign")
@MapperScan("com.xie.gulimall.product.dao")
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
